class Solution {
private:
    int count_sub(const int& n) const { //计算长度为 n 的等差数列有多少个子数列。
        if(n < 3)return 0;
        return (n * (n + 1)) / 2 - 2 * n + 1;
    }
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        int i = 0, ans = 0;
        while(i + 2 < nums.size()){
            int j = i + 2;
            while(j < nums.size() && nums[j] - nums[j - 1] == nums[j - 1] - nums[j - 2]){
                j++;
            }
            ans += count_sub(j - i);//更新答案
            i = j - 1;
        }
        return ans;
    }
};

/**
 * 2021.8.10
 * 对于一段长为 n 的等差数列，它的子序列的数量可以直接计算。
 * 那么就每次找到从当前起点最长的等差数列，计算子序列的数量
 * 重复这个过程，直到序列末尾。
 */